package com.maotouying.recycleviewtest;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import android.content.Intent;
import android.nfc.Tag;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.maotouying.recycleviewtest.adapter.GridViewAdapter;
import com.maotouying.recycleviewtest.adapter.ListViewAdapter;
import com.maotouying.recycleviewtest.adapter.RecyclerViewBaseAdapter;
import com.maotouying.recycleviewtest.adapter.StaggerAdapter;
import com.maotouying.recycleviewtest.beans.Datas;
import com.maotouying.recycleviewtest.beans.ItemBean;

import java.util.ArrayList;

/**
 * 1、引入RecyclerView控件的包，添加依赖
 * 2、找到控件（布局文件），findViewById
 * 3、准备数据
 * 4、设置布局管理器
 * 5、创建适配器
 * 6、设置适配器
 * 7、显示数据
 */

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "223MainActivity";


    // 全局变量，在方法里面，都可以操作了

    private ArrayList<ItemBean> mData;
    private RecyclerView mList; // 在方法里面可以使用
    private RecyclerViewBaseAdapter mAdapter;
    private SwipeRefreshLayout mRefreshLayout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 找到控件
        mList = this.findViewById(R.id.recycler_view);
        mRefreshLayout = this.findViewById(R.id.refresh_layout);
        // 准备数据
        /**
         *
         */
        initDate();
        //    设置默认的显示listview效果
        showList(true, false);

        // 处理下拉刷新
        handlerDownPullUpdate();
    }

    private void handlerDownPullUpdate() {

        // 下拉刷新旋转颜色
        mRefreshLayout.setColorSchemeResources(R.color.colorPrimary, R.color.colorPrimaryDark, R.color.colorAccent);

        mRefreshLayout.setEnabled(true);
        mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                // 在这里执行舒心数据的操作
                /**
                 * 在顶部时，下拉的时候，这个方法就会被执行
                 * 这个方法是在主线程里面，不可以执行耗时操作
                 * 一般来说，去请求数据需要再开一个线程去获取
                 * 这里演示，值添加一条数据
                 *
                 */
                // 添加一条数据
                ItemBean data = new ItemBean();
                data.title = "下拉刷新的一个title。。。";
                data.icon = R.mipmap.pic_09;
                mData.add(0, data); // 添加到最顶部，就是第0个位置

                //更新UI
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        // 这里做两件事，1、让刷新停止 2、更新列表
                        mAdapter.notifyDataSetChanged();
                        mRefreshLayout.setRefreshing(false);
                    }
                }, 3000);
            }
        });
    }

    private void initListener() {
        // 在适配器里面设置监听
        mAdapter.setOnItemClickListener(new RecyclerViewBaseAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                // 在这里处理点击事件
                Toast.makeText(MainActivity.this, "您点击的是第" + position + "个条目", Toast.LENGTH_SHORT).show();
            }
        });
    }

    /**
     * 模拟数据的方法
     */
    private void initDate() {
        // List<DataBean> ----> Adapter----> setAdapter---->显示数据

        mData = new ArrayList<>();

        //    创建模拟数据
        for (int i = 0; i < Datas.icons.length; i++) {
            // 创建数据对象
            ItemBean data = new ItemBean();
            data.icon = Datas.icons[i];
            data.title = "mingtai哥的" + i + "个条目";
            mData.add(data);
        }


    }


    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();

        switch (itemId) {
            // ListView效果
            case R.id.list_view_vertical_stander:
                showList(true, false);
                Log.d(TAG, "点击了ListView的垂直标准");
                break;
            case R.id.list_view_vertical_reverse:
                Log.d(TAG, "点击了ListView的垂直反向");
                showList(true, true);
                break;
            case R.id.list_view_horizontal_stander:
                Log.d(TAG, "点击了ListView的水平标准");
                showList(false, false);
                break;
            case R.id.list_view_horizontal_reverse:
                showList(false, true);
                break;

            // GridView效果
            case R.id.grid_view_vertical_stander:
                showGrid(true, false);
                break;
            case R.id.grid_view_vertical_reverse:
                showGrid(true, true);
                break;
            case R.id.grid_view_horizontal_stander:
                showGrid(false, false);
                break;
            case R.id.grid_view_horizontal_reverse:
                showGrid(false, true);
                break;

            // 瀑布流效果
            case R.id.stagger_view_vertical_stander:
                showStagger(true, false);
                break;
            case R.id.stagger_view_vertical_reverse:
                showStagger(true, true);
                break;
            case R.id.stagger_view_horizontal_stander:
                showStagger(false, false);
                break;
            case R.id.stagger_view_horizontal_reverse:
                showStagger(false, true);
                break;
            // 多种条目类型
            case R.id.more_type:
                Intent intent = new Intent(this, MoreTypeActivity2.class);
                startActivity(intent);
                break;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * 这个方法是为了显示瀑布流Stagger的效果
     */
    private void showStagger(boolean isVertical, boolean isReverse) {
        // 准备布局管理器
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, isVertical ? StaggeredGridLayoutManager.VERTICAL : StaggeredGridLayoutManager.HORIZONTAL);
        //设置布局管理器方向
        layoutManager.setReverseLayout(isReverse);

        //设置布局管理器到RecyclerView里面
        mList.setLayoutManager(layoutManager);

        // 创建适配器
        mAdapter = new StaggerAdapter(mData);
        //设置适配器
        mList.setAdapter(mAdapter);

        // 设置 初始化事件
        initListener();

    }

    /**
     * 创建另外一个showGrid效果
     */
    private void showGrid(boolean isVertical, boolean isReverse) {
        // 创建布局管理器
        GridLayoutManager layoutManager = new GridLayoutManager(this, 3);
        // 设置方向 水平还是垂直 androidx.recyclerview.widget.LinearLayoutManager.HORIZONTAL
        layoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
        // 设置 标准（正向）还是反向
        layoutManager.setReverseLayout(isReverse);
        // 设置布局管理器
        mList.setLayoutManager(layoutManager);

        //创建适配器
        mAdapter = new GridViewAdapter(mData);
        // 塞进去数据
        mList.setAdapter(mAdapter);

        // 设置 初始化事件
        initListener();

    }

    /**
     * 用于显示listview一样的效果
     */
    private void showList(boolean isVertical, boolean isReverse) {
        // RecyclerView 需要设置样式，就是布局管理器
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        // 设置布局管理器来控制
        // 设置水平还是垂直 androidx.recyclerview.widget.LinearLayoutManager.HORIZONTAL
        layoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
        // 设置标准还是反向
        layoutManager.setReverseLayout(isReverse);
        mList.setLayoutManager(layoutManager);
        // 创建适配器
        mAdapter = new ListViewAdapter(mData);
        mList.setAdapter(mAdapter);

        // 设置 初始化事件
        initListener();

    }
}